home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Utilities / Scion / ARexx / translate.rexx < prev    next >
OS/2 REXX Batch file  |  1997-11-04  |  16KB  |  484 lines

  1. /****************************************************************************
  2.  *                                                                          *
  3.  * $VER: Translate 1.37 (12 Oct 1997)
  4.  *                                                                          *
  5.  *                      Written by Freddy Ariës                             *
  6.  * Address: Lindeboomweg 7, NL-7135 KE Harreveld, The Netherlands.          *
  7.  *                                                                          *
  8.  * You may have noticed that setting another language in Locale means that  *
  9.  * the date (month) fields of your database are no longer recognized        *
  10.  * correctly. This is where Translate comes in.                             *
  11.  * It will convert all the standard language fields in a Scion database (in *
  12.  * v4.0+, that means the Date fields) into another (predefined) language.   *
  13.  * Currently Dutch, German, French, Italian, Norwegian, Swedish and Finnish *
  14.  * are supported, but only translation to and from English is possible.     *
  15.  * Adding other languages shouldn't be too hard.                            *
  16.  *                                                                          *
  17.  * This script uses (by default) the rexxreqtools.library (which requires   *
  18.  * a version of reqtools larger than 2.0 and rexxsyslib.library)            *
  19.  * If you do not have these, run SetDefaults.rexx to change the settings.   *
  20.  *                                                                          *
  21.  * TO DO:                                                                   *
  22.  * - add Locale support (current language <-> English)                      *
  23.  *                                                                          *
  24.  * DONE:                                                                    *
  25.  * - progress indicator, using rexxarplib.library                           *
  26.  *   (requested by Robbie Akins himself)                                    *
  27.  * - now uses preference file for default settings                          *
  28.  * - Scion v5 recognition added. Due to the nature of dates in Scion V5,    *
  29.  *   this script doesn't work anymore for Scion version 5 and up. Scion     *
  30.  *   will always recognize the correct date, and display it in the          *
  31.  *   currently selected user-language.                                      *
  32.  *                                                                          *
  33.  ****************************************************************************/
  34.  
  35. options failat 20; options results
  36. arg panum outval
  37.  
  38. versionstr = "1.37"
  39.  
  40. /* Don't change the settings here! Run SetDefaults.rexx instead! */
  41. usereq = 1; outp = 1; prgrs = 1; pgopen = 0
  42. PSCR = "SCIONGEN"
  43.  
  44. scrdev = stdout
  45. scrname = "CON:0//639//Scion Output/AUTO/SCREEN"
  46. NL = '0A'x
  47.  
  48. /* parse command line options, to allow calling the script automatically,
  49.  * eg. from a function key
  50.  */
  51.   
  52. do while panum = '?'
  53.   Tell("NUMOPT/N,QUIET/S,NOREQ/s: ")
  54.   pull panum outval
  55. end
  56.  
  57. /* read preferences file. */
  58.  
  59. if open(pfile, 'ENV:Scion/ScionRexx.prefs', 'r') then do
  60.   do while ~eof(pfile)
  61.     inln = readln(pfile)
  62.     if inln ~= "" then do
  63.       wstr = upper(word(inln, 1))
  64.       if wstr = "USEREQ" then
  65.         usereq = 1
  66.       else if wstr = "NOUSEREQ" then
  67.         usereq = 0
  68.       else if wstr = "PROGRESS" then
  69.         prgrs = 1
  70.       else if wstr = "NOPROGRESS" then
  71.         prgrs = 0
  72.       else if wstr = "PUBSCREEN" then
  73.         pscr = strip(delstr(inln, 1, length(wstr)), 'b', ' "')
  74.     end
  75.   end
  76.   close(pfile)
  77. end
  78.  
  79. if pscr = "" | (pscr ~= "WORKBENCH" & ~show('p', pscr)) then
  80.   pscr = "SCIONGEN"
  81. wstr = right(notesdir, 1)
  82. if wstr ~= '/' & wstr ~= ':' then notesdir = ""
  83. scrname = scrname||pscr
  84.  
  85. if panum ~= "" then do
  86.   if panum = "QUIET" then do
  87.     panum = ""; outval = "QUIET"
  88.     lang = 0
  89.   end
  90.   else if panum = "NOREQ" then do
  91.     panum = ""; outval = "NOREQ"
  92.     lang = 0
  93.   end
  94.   else do
  95.     pnum = C2D(upper(left(panum,1)))
  96.     if pnum >= 65 & pnum <= 92 then do
  97.       panum = pnum - 64
  98.       lang = CheckAnswer(panum)
  99.     end
  100.     else if pnum > 47 & pnum < 58 then
  101.       lang = CheckAnswer(panum)
  102.     else do
  103.       lang = 0; panum = ""
  104.     end
  105.   end
  106. end
  107. else
  108.   lang = 0
  109.  
  110. if outval = "QUIET" then do
  111.   outp = 0; usereq = 0; prgrs  0
  112. end
  113. else if outval = "NOREQ" then do
  114.   usereq = 0; prgrs = 0
  115. end
  116.  
  117. if usereq & ~show('l','rexxreqtools.library') then do
  118.   if exists('libs:rexxreqtools.library') then
  119.     call addlib('rexxreqtools.library',0,-30,0)
  120.   else do
  121.     usereq = 0; outp = 1
  122.     Tell("Unable to open rexxreqtools.library - using text output")
  123.   end
  124. end
  125.  
  126. if ~usereq then prgrs = 0
  127.  
  128. if prgrs & ~show('l','rexxarplib.library') then do
  129.   if exists('libs:rexxarplib.library') then
  130.     call addlib('rexxarplib.library',0,-30,0)
  131.   else
  132.     prgrs = 0
  133. end
  134.  
  135. screentofront(pscr)
  136.  
  137. if ~show('P','SCIONGEN') then do
  138.   EndString('I am sorry to say that the SCION Genealogist' || NL ||,
  139.     'database is not available. Please start the' || NL ||,
  140.     'SCION program BEFORE using this script!')
  141. end
  142.  
  143. myport = "SCIONGEN"
  144. address value myport
  145. GETDBNAME
  146. dbname = upper(RESULT)
  147. GETPROGVERSION
  148. progvers = RESULT
  149.  
  150. if outp & ~usereq then do
  151.   if pscr ~= "WORKBENCH" then do
  152.     scrdev = 'SCNDSCSCR'
  153.     if ~open(scrdev, scrname, 'w') then scrdev = stdout
  154.   end
  155.   Tell("Translate - Scion Language Fields Converter "||versionstr||" by Freddy Ariës")
  156.   Tell("Database: "||dbname|| NL)
  157. end
  158.  
  159. if progvers >= 5 then do
  160.   EndString("********************************************"|| NL ||,
  161.     "***     SCION VERSION "||progvers||" DETECTED.     ***"|| NL ||,
  162.     "*** THIS SCRIPT IS NO LONGER REQUIRED!!! ***"|| NL ||,
  163.     "********************************************")
  164. end
  165.  
  166. if lang = 0 then do
  167.   if ~outp then
  168.     EndString("Missing required argument!")
  169.     /* even though you will never get to see the message... */
  170.   if usereq then do
  171.     answ = rtezrequest('Database: '||dbname || NL ||,
  172.       'Please select one of the following conversions: ' || NL || NL ||,
  173.       ' a) Nederlands -> English      i) Norsk    -> English' || NL ||,
  174.       ' b) English    -> Nederlands   j) English  -> Norsk' || NL ||,
  175.       ' c) Deutsch    -> English      k) Svenska  -> English' || NL ||,
  176.       ' d) English    -> Deutsch      l) English  -> Svenska' || NL ||,
  177.       ' e) Français   -> English      m) Suomi    -> English' || NL ||,
  178.       ' f) English    -> Français     n) English  -> Suomi' || NL ||,
  179.       ' g) Italiano   -> English      o) current language -> English' || NL ||,
  180.       ' h) English    -> Italiano     p) English -> current language' || NL ||,
  181.       ' 0) Abort' ||,
  182.       NL, '_a|_b|_c|_d|_e|_f|_g|_h|_i|_j|_k|_l|_m|_n|_o|_p|_0','Translate - Scion Language Field Converter '|| versionstr || ' by Freddy Ariës','rtez_flags=ezreqf_noreturnkey rt_pubscrname='||PSCR)
  183.   end
  184.   else if outp then do
  185.     Tell("Please select one of the following conversions: ")
  186.     Tell(" a) Nederlands -> English      i) Norsk    -> English")
  187.     Tell(" b) English    -> Nederlands   j) English  -> Norsk")
  188.     Tell(" c) Deutsch    -> English      k) Svenska  -> English")
  189.     Tell(" d) English    -> Deutsch      l) English  -> Svenska")
  190.     Tell(" e) Français   -> English      m) Suomo    -> English")
  191.     Tell(" f) English    -> Français     n) English  -> Suomi")
  192.     Tell(" g) Italiano   -> English      o) current language -> English")
  193.     Tell(" h) English    -> Italiano     p) English -> current language")
  194.     Tell(" 0) Abort")
  195.     TellNN("Your choice: ")
  196.     answ = readln(scrdev)
  197.     answ = upper(left(answ,1))
  198.     pnum = C2D(answ)
  199.     if pnum >= 65 & pnum <= 92 then
  200.       answ = pnum - 64
  201.   end
  202.   lang = CheckAnswer(answ)
  203. end
  204.  
  205. if lang = 0 | answ = 0 then EXIT
  206.  
  207. if prgrs then do
  208.   Postmsg(10, 10, "Scion Translate (by Freddy Ariës)\Database: "||dbname||"\ \ ", PSCR)
  209.   pgopen = 1
  210. end
  211.  
  212. if lang = 15 | lang = 16 then do
  213.   IF ~SHOW('L','locale.library') then do
  214.     CALL ADDLIB('locale.library',0,-30)
  215.   END;
  216.  
  217.   catalog = OpenCatalog("scion.catalog","english",0);
  218.   d1 = ""
  219.   dat_e1 = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
  220.   do lcnt=1 to 12
  221.     al = word(dat_e2, lcnt)
  222.     a1 = GetCatalogStr(catalog, 175+lcnt, al);
  223.     if upper(a1) ~= upper(al) then
  224.       d1 = d1||a1||' '
  225.   end
  226.   a1 = GetCatalogStr(catalog, 189, "Abt")
  227.   if upper(a1) ~= "ABT" then d1 = d1||a1||' '
  228.   a2 = GetCatalogStr(catalog, 188, "About")
  229.   if upper(a2) ~= "ABOUT" then do
  230.     if length(a2) > 5 then
  231.       d1 = d1||a1||' '
  232.     else
  233.       d1 = d1||a2||' '
  234.   end
  235.  
  236.   a1 = GetCatalogStr(catalog, 191, "Bef")
  237.   if upper(a1) ~= "BEF" then d1 = d1||a1||' '
  238.   a2 = GetCatalogStr(catalog, 188, "Before")
  239.   if upper(a2) ~= "Before" then do
  240.     if length(a2) > 5 then
  241.       d1 = d1||a1||' '
  242.     else
  243.       d1 = d1||a2||' '
  244.   end
  245.  
  246.   a1 = GetCatalogStr(catalog, 193, "Aft")
  247.   if upper(a1) ~= "AFT" then d1 = d1||a1||' '
  248.   a2 = GetCatalogStr(catalog, 192, "After")
  249.   if upper(a2) ~= "AFTER" then do
  250.     if length(a2) > 5 then
  251.       d1 = d1||a1
  252.     else
  253.       d1 = d1||a2
  254.   end
  255. end
  256.  
  257. select
  258.   /* Make sure the string in datout is always <= the one in datin, or
  259.    * the resulting string might not fit in the date field anymore.
  260.    * Note: some 2-letter fields ('CA', 'VR', 'AV') can't follow this rule.
  261.    */
  262.   when lang = 1 then do
  263.     datin = "MRT MAA MEI OKT CA CA. CIRCA VR VR. VOOR NA"
  264.     datout= "Mar Mar May Oct Abt Abt About Bef Bef Bef Aft"
  265.   end
  266.   when lang = 2 then do
  267.     datin = "MAR MAY ABT ABOUT BEF BEFORE AFT AFTER"
  268.     datout= "Mrt Mei Ca Circa Vr Voor Na Na"
  269.   end
  270.   when lang = 3 then do
  271.       datin = "MÄR Mär MRZ MAI OKT DEZ CA CA. UNGEFÄHR UNGEFäHR VOR NAC NACH"
  272.       datout= "Mar Mar Mar May Oct Dec Abt Abt About About Bef Aft Aft"
  273.   end
  274.   when lang = 4 then do
  275.     datin = "MAR MAY OCT DEC ABT ABOUT BEF BEFORE AFT AFTER"
  276.     datout= "Mär Mai Okt Dez Ca Ca Vor Vor Nac Nach"
  277.   end
  278.   when lang = 5 then do
  279.     datin = "FEV FéV FÉV AVR MAI UIN UIL OUT OÛT OûT DéC DÉC ENV ENVIRON AV AVANT APR APRES APRèS APRÈS"
  280.     datout = "Feb Feb Feb Apr May Jun Jul Aug Aug Aug Dec Dec Abt About Bef Bef Aft After After After"
  281.   end
  282.   when lang = 6 then do
  283.     datin = "FEB APR MAY JUN JUL AUG DEC ABT ABOUT BEF BEFORE AFT AFTER"
  284.     datout= "Fév Avr Mai uin uil oût Déc Env Env Av Avant Apr Après"
  285.   end
  286.   when lang = 7 then do
  287.     datin = "GEN MAG GIU LUG AGO SET OTT DIC INTORNO AL CA. PRIMA PRI DOPO DOP"
  288.     datout = "Jan May Jun Jul Aug Sep Oct Dec About . Abt Bef Bef Aft Aft"
  289.   end
  290.   when lang = 8 then do
  291.     datin = "JAN MAY JUN JUL AUG SEP OCT DEC ABOUT ABT BEFORE BEF AFTER AFT"
  292.     datout= "Gen Mag Giu Lug Ago Set Ott Dic Ca. Ca. Prima Pri Dopo Dop"
  293.   end
  294.   when lang = 9 then do
  295.     datin = "MAI OKT DES OMKRING CA. FøR FØR ETTER ETT"
  296.     datout = "May Oct Dec About Abt Bef Bef After Aft"
  297.   end
  298.   when lang = 10 then do
  299.     datin = "MAY OCT DEC ABOUT ABT BEFORE BEF AFTER AFT"
  300.     datout= "Mai Okt Des Ca. Ca. Før Før Etter Ett"
  301.   end
  302.   when lang = 11 then do
  303.     datin = "MAJ OKT UNGEFäR UNGEFÄR CA. FöRE FÖRE F. EFTER EFT"
  304.     datout = "May Oct Dec About About Abt Bef Bef Bef After Aft"
  305.   end
  306.   when lang = 12 then do
  307.     datin = "MAY OCT ABOUT ABT BEFORE BEF AFTER AFT"
  308.     datout= "Maj Okt Ca. Ca. Före F. Efter Eft"
  309.   end
  310.   when lang = 13 then do
  311.     datin = "TAM HEL MAA HUH TOU KES HEI ELO SYY LOK MAR JOU NOIN N. ENNEN ENN JäLKEEN JÄLKEEN JäL JÄL"
  312.     datout = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Abt Abt Bef Bef After After Aft Aft"
  313.   end
  314.   when lang = 14 then do
  315.     datin = "JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ABOUT ABT BEFORE BEF AFTER AFT"
  316.     datout= "Tam Hel Maa Huh Tou Kes Hei Elo Syy Lok Mar Jou Noin n. Ennen Enn Jäl Jäl"
  317.   end
  318.   when lang = 15 then do
  319.    // datin = "TAM HEL MAA HUH TOU KES HEI ELO SYY LOK MAR JOU NOIN N. ENNEN ENN JäLKEEN JÄLKEEN JäL JÄL"
  320.  
  321.     datout = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Abt Abt Bef Bef After After Aft Aft"
  322.   end
  323.   when lang = 16 then do
  324.     datin = "JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ABOUT ABT BEFORE BEF AFTER AFT"
  325.    //  datout= "Tam Hel Maa Huh Tou Kes Hei Elo Syy Lok Mar Jou Noin n. Ennen Enn Jäl Jäl"
  326.   end
  327.   otherwise
  328.     EndString("Invalid option: "lang)
  329. end
  330.  
  331. if ~usereq then
  332.   Tell("Parsing Personal Details...")
  333. else if pgopen then
  334.   Postmsg(,, "\\Processing person:\", PSCR)
  335.  
  336. GETTOTALIRN
  337. TotalIRN = RESULT
  338. do i = 1 to TotalIRN
  339.   if pgopen then Postmsg(,,"\\\"||i||" (of "||TotalIRN||")", PSCR)
  340.   EXISTPERSON i
  341.   /* Skip deleted persons */
  342.   if RESULT = 'YES' then
  343.   do
  344.  
  345.     if progvers < 4 then do
  346.       /* Since V4, sex is a toggle gadget, and conversion is unnecessary */
  347.       GETSEX i
  348.       sx = ConvertSex(RESULT)
  349.       if sx ~= "" then PUTSEX i sx
  350.     end
  351.  
  352.     GETBIRTHDATE i
  353.     datestr = ParseDate(RESULT)
  354.     if datestr ~= "" then PUTBIRTHDATE i datestr
  355.     GETBAPTISMDATE i
  356.     datestr = ParseDate(RESULT)
  357.     if datestr ~= "" then PUTBAPTISMDATE i datestr
  358.     GETDEATHDATE i
  359.     datestr = ParseDate(RESULT)
  360.     if datestr ~= "" then PUTDEATHDATE i datestr
  361.     GETBURIALDATE i
  362.     datestr = ParseDate(RESULT)
  363.     if datestr ~= "" then PUTBURIALDATE i datestr
  364.   end
  365. end
  366. if ~usereq then do
  367.   Tell("Done ("||TotalIRN||" persons parsed).")
  368.  
  369.   /* Now the list of families... */
  370.   Tell("Parsing Family Details...")
  371. end
  372. else if pgopen then
  373.   Postmsg(,, "\\Processing family:\ ", PSCR)
  374.  
  375.   
  376. GETTOTALFGRN
  377. TotalFGRN = Result
  378. do i = 1 to TotalFGRN
  379.   if pgopen then Postmsg(,, "\\\"||i||" (of "||TotalFGRN||")", PSCR)
  380.   EXISTFAMILY i
  381.   /* Skip deleted families */
  382.   if RESULT = 'YES' then do
  383.     GETMARRYDATE i
  384.     datestr = ParseDate(RESULT)
  385.     if datestr ~= "" then PUTMARRYDATE i datestr
  386.     GETENGAGEDATE i
  387.     datestr = ParseDate(RESULT)
  388.     if datestr ~= "" then PUTENGAGEDATE i datestr
  389.     GETENDDATE i
  390.     datestr = ParseDate(RESULT)
  391.     if datestr ~= "" then PUTENDDATE i datestr
  392.   end
  393. end
  394.  
  395. if usereq then do
  396.   rtezrequest('Scion Translation is ready.' || NL || 'Parsed '||,
  397.     TotalIRN||' persons and '||TotalFGRN||' families.','_Ok','Translate Message:','rt_pubscrname = '||PSCR)
  398.   if pgopen then Postmsg()
  399. end
  400. else
  401.   EndString("Done ("||TotalFGRN||" families parsed)."||NL)
  402.  
  403. EXIT
  404.  
  405. CheckAnswer: PROCEDURE EXPOSE outp usereq pgopen scrdev pscr
  406. parse arg str
  407. if str < 0 | str > 16 then
  408.   EndString("Invalid option: "||str||" -- program terminated.")
  409. return str
  410.  
  411. ConvertSex: PROCEDURE EXPOSE lang
  412. parse arg sxstr
  413. if lang = '1' & sxstr = "V" then sxstr = "F"
  414. else if lang = '2' & sxstr = "F" then sxstr = "V"
  415. else if lang = '3' & sxstr = "W" then sxstr = "F"
  416. else if lang = '4' & sxstr = "F" then sxstr = "W"
  417. else if (lang = '9' | lang = '11') & sxstr = "K" then sxstr = "F"
  418. else if (lang = '10' | lang = '12') & sxstr = "F" then sxstr = "K"
  419. else if lang = '13' & sxstr = "N" then sxstr = "F"
  420. else if lang = '14' & sxstr = "F" then sxstr = "N"
  421. /* French and Italian: 'M' and 'F', same as in English */
  422. else sxstr = ""
  423. return sxstr
  424.  
  425. /* PARSEDATE SUBROUTINE */
  426. /* For each word in the datestr string, see if it occurs in the datin
  427.  * string. If it does, replace it with the equivalent in the datout string
  428.  */
  429. ParseDate: PROCEDURE EXPOSE datin datout
  430. parse arg datestr
  431. datestr = strip(datestr); /* remove leading blanks */
  432. if datestr = "" then return datestr
  433. rdate = translate(datestr,'  ','-/'); /* replace all '-' or '/' by ' ' */
  434.  
  435. datestr = upper(rdate)
  436.  /* keep rdate in its original case, so we don't accidentally change
  437.   * the case of any other words in the resulting
  438.   */
  439. cp = 1
  440.  
  441. /* check all words with the datin string */
  442. do cnt = 1 to words(datestr)
  443.   cw = word(datestr, cnt)
  444.   num = find(datin, cw)
  445.   if num > 0 then do
  446.     rep = word(datout, num)
  447.     if rep="." then rep=""
  448.     rl = length(rep)
  449.     cl = length(cw)
  450.     cp = index(upper(rdate), cw, cp)
  451.     rdate = delstr(rdate, cp, cl)
  452.     rdate = insert(rep, rdate, cp-1)
  453.   end
  454. end
  455. return rdate
  456.  
  457. Tell: PROCEDURE EXPOSE outp scrdev
  458. parse arg str
  459. if outp then
  460.   writeln(scrdev, str)
  461. return 0
  462.  
  463. TellNN: PROCEDURE EXPOSE outp scrdev
  464. parse arg str
  465. if outp then
  466.   writech(scrdev, str)
  467. return 0
  468.  
  469. EndString: PROCEDURE EXPOSE outp usereq pgopen scrdev pscr
  470. parse arg str
  471. /* If you turned off stdout, no error messages will be shown! */
  472. if usereq then
  473.   rtezrequest(str,'E_xit','Translate Message:','rt_pubscrname = '||PSCR)
  474. else do
  475.   Tell(str || '0A'x)
  476. end
  477. if pgopen then Postmsg()
  478. if outp & ~usereq & (scrdev ~= stdout) then do
  479.   Tell("Press <return> to exit.")
  480.   readln(scrdev)
  481.   close(scrdev)
  482. end
  483. EXIT
  484.